from time import sleep

from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

from util.log import logger

"""def open_browser(type_):
    try:
        driver = getattr(webdriver,type_)()

    except info as e:
        print(e)
        driver = webdriver.Chrome()
        return driver
"""


class Base:
    def __init__(self, driver):
        # self.driver = open_browser(type_)
        self.driver = driver
        #self.driver = webdriver.Chrome()

    # 截图
    def screen(self,doc=""):
        """页面截图
                :param doc: 需要提示的模块
                :return 不需要返回值
        """
        png_path = ("D:/File/workspace/Uiautomation/img/")
        file_path = png_path + f"{doc}_{time.strftime('%y-%m-%d--%H-%M-%S', time.localtime())}.png"
        try:
            self.driver.save_screenshot(file_path)
            logger.info(f"截图成功,文件路径:{file_path}")
        except:
            logger.info(f"{doc}-截图失败!")


    # 打开url
    def get(self, url,doc=""):
        try:
            self.driver.get(url)
            logger.info("{}-URL:{}打开成功".format(doc, url))
        except:
            logger.info("{}-URL:{}打开失败".format(doc, url))
            self.screen("{}_URL_{}打开失败".format(doc,url))
            raise

    # 元素查找
    def get_ele(self, loc,doc="",timeout=10):
        try:
            self.explicit_wait(doc ,timeout,loc)
            logger.info("模块:{},元素_{}_获取成功".format(doc, loc))
            return self.driver.find_element(*loc)
        except:
            logger.info("模块:{},元素_{}_获取失败".format(doc,loc))
            self.screen("模块_{}_元素_{}_获取失败".format(doc,loc))
            raise

    # 点击
    def click(self, loc,doc="",timeout=10):
        ele = self.explicit_wait(loc,timeout, doc)
        try:

            ele.click()
            logger.info("模块:{},元素_{}_点击成功".format(doc,loc))
        except:
            logger.info("模块:{},元素_{}_点击失败".format(doc, loc))
            self.screen("模块_{}_元素_{}_点击失败".format(doc,loc))
            raise

    # 设置值
    def input(self, loc,txt,doc="",timeout=10):

        try:
            ele = self.explicit_wait(loc,timeout,doc)
            ele.send_keys(txt)
            logger.info("模块:{},元素_{}_输入_{}_成功".format(doc,loc,txt))
        except:
            logger.info("模块:{},元素_{}_,输入_{}_失败".format(doc, loc,txt))
            self.screen("模块_{}_元素_{}_输入_{}_失败".format(doc,loc,txt))
            raise

    """
        鼠标事件

        click(on_element=None)：单击
        on_element：指被点击的元素，如果该参数为none，将单击当前鼠标所在位置
        
        double_click(on_element=None)：双击
        on_element：只要双击的元素，如果该参数为none，将单击当前鼠标所在位置
        
        context_click(on_element=None)： 右击
        
        on_element：只要双击的元素，如果该参数为none，将单击当前鼠标所在位置
        
        drag_and_drop(source, target)：鼠标拖动
        Source：鼠标拖动的元素 Target：鼠标释放的目标元素
        
        move_to_element(to_element) ：鼠标悬停
        to_element：指定元素
        
        move_to_t(to_element) ：鼠标移动
        to_element：指定元素
        
        perform()：提交已保存的操作
    例如：
        cation= self.mouse(self.serch_button,doc="鼠标左击")
        cation.click(self.serch_button).perform()
    """
    # 鼠标操作
    def mouse(self,loc,timeout=10,doc=""):
        self.explicit_wait(loc,timeout,doc)
        try:
            logger.info("模块:{},点击_{}_成功".format(doc, loc))
            return ActionChains(self.driver)
        except:
            logger.info("模块:{},点击_{}_失败".format(doc,loc))
            self.screen("模块_{}_点击_{}_失败".format(doc,loc))
            raise

    def keys(self):
        pass

    # 断言
    def assert_tool(self,txt,doc=""):

        tit = self.driver.title
        try:
            if tit == txt:
                logger.info("模块:{},断言_{}_通过".format(doc,txt))
            else:
                logger.info("模块:{},断言_{}_失败".format(doc,txt))

        except:
            logger.info("模块:{},断言_{}_失败".format(doc,txt))
            self.screen("模块_{}_断言_{}_失败".format(doc,txt))
            raise

    # 切换window
    def ifrme_window(self):
        pass

    # 隐式等待
    def implicit_wait(self):
        pass

    """
    # 等待元素存在
    def wait_ele_presence(self, locator, center=True, timeout=15, doc=""):
             知识点解析：
        #scrollIntoView:
                # 如果为true，元素的顶端将和其所在滚动区的可视区域的顶端对齐。
                # 如果为false，元素的底端将和其所在滚动区的可视区域的底端对齐。
        #scrollIntoViewIfNeeded:
                #如果为true，则元素将在其所在滚动区的可视区域中居中对其。
                # 如果为false，则元素将与其所在滚动区的可视区域最近的边缘对齐。 根据可见区域最靠近元素的哪个边缘，
                # 元素的顶部将与可见区域的顶部边缘对准，或者元素的底部边缘将与可见区域的底部边缘对准。

        #log.info('info') #异常信息被自动添加到日志消息中
        #Logger.error(msg[ , *args[ , **kwargs] ] )只记录错误信息
        try:
            start = datetime.datetime.now()
            ele = WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located(locator))
            end = datetime.datetime.now()
            Logger.info("{}-元素{}已存在，等待{}秒".format(doc, locator, (end - start).seconds))
            self.driver.execute_script("arguments[0].scrollIntoViewIfNeeded(arguments[1]);", ele, center)
            #return ele
        except:
            Logger.info("{}-元素不存在-{}".format(doc, locator))
            self.save_screenshot("{}-元素不存在".format(doc))
            raise"""

    # 显式等待
    def explicit_wait(self,loc,timeout=10,doc=""):
        try:
            ele = WebDriverWait(self.driver,timeout).until(EC.presence_of_element_located(loc))
            logger.info("模块:{},元素_{}_等待成功".format(doc,loc))
            return ele
        except:
            logger.error("模块:{},元素_{}_等待失败".format(doc,loc))
            self.screen("模块_{}_元素_{}_等待失败".format(doc,loc))
            raise

    # 强制等待
    def sleep_wait(self, s):
        sleep(s)

    # 关闭浏览器
    def quit(self):
        self.driver.quit()
